{
  "nbformat": 4,
  "nbformat_minor": 0,
  "metadata": {
    "colab": {
      "name": "Самостоятельная работа №1.ipynb",
      "provenance": [],
      "collapsed_sections": [],
      "include_colab_link": true
    },
    "kernelspec": {
      "name": "python3",
      "display_name": "Python 3"
    },
    "language_info": {
      "name": "python"
    }
  },
  "cells": [
    {
      "cell_type": "markdown",
      "metadata": {
        "id": "view-in-github",
        "colab_type": "text"
      },
      "source": [
        "<a href=\"https://colab.research.google.com/github/Afanasyy/colab/blob/main/%D0%A1%D0%B0%D0%BC%D0%BE%D1%81%D1%82%D0%BE%D1%8F%D1%82%D0%B5%D0%BB%D1%8C%D0%BD%D0%B0%D1%8F_%D1%80%D0%B0%D0%B1%D0%BE%D1%82%D0%B0_%E2%84%961.ipynb\" target=\"_parent\"><img src=\"https://colab.research.google.com/assets/colab-badge.svg\" alt=\"Open In Colab\"/></a>"
      ]
    },
    {
      "cell_type": "markdown",
      "source": [
        "# Самостоятельная работа №1\n",
        "\n",
        "* **Срок сдачи**: 26.03.22\n",
        "* **Куда отправлять**: logerk3@gmail.com\n",
        "  * Сюда же можно писать по вопросам, связанным с работой\n",
        "* **Что отправлять**: Jupyter Notebook (файл с расширением `.ipynb`), в котором находится решение данной работы\n"
      ],
      "metadata": {
        "id": "D3F-Hqr-vBRI"
      }
    },
    {
      "cell_type": "markdown",
      "source": [
        "## Задачи\n",
        "\n",
        "1. Найдите любые три статьи на Wikipedia.org\n",
        "  * Примеры статей: https://ru.wikipedia.org/wiki/Luigi%E2%80%99s_Mansion_3, https://ru.wikipedia.org/wiki/Joy-Con\n",
        "  * **NB**: Это лишь примеры! Вам необходимо найти свои \n",
        "3. Используя библиотеки `requests` и `BeautifulSoup`, скачайте данные три статьи и сохраните из них текст\n",
        "  * \\*Найдите все изображения и сохраните ссылки на них в файл `links.txt`\n",
        "4. Используя библиотеку `re` (регулярные выражения), очистите сохранённые тексты от специальных символов (например, от знаков `'][@#%^` и т.д.) и от стоп-слов\n",
        "5. Используя библиотеку `NLTK`, произведите токенизацию по словам и по предложениям\n",
        "  * \\*Найдите среднюю длину предложения\n",
        "6. Используя библиотеку `pymorphy`, найдите леммы всех слов, сохраните полученные леммы в файл `lemmas.txt`\n",
        "  * **NB**: Леммы должны идти через пробел: `лемма_1 лемма_2 ... лемма_N`\n",
        "7. Найдите частоту встречаемости каждой леммы, то есть составьте частотный словарь\n",
        "  * \\*Выведите на экран лемму, которая встречается наибольшее количество раз\n",
        "8. С помощью библиотеки `csv` сохраните частоты лем в файл `lemmas_frequencies.csv`\n",
        "  * Файл должен иметь следующую структуру:\n",
        "\n",
        "| Лемма   | Частота  |\n",
        "|---------|----------|\n",
        "| лемма_1 | 100      |\n",
        "| лемма_2 | 200      |\n",
        "| ...     | ...      |\n",
        "| лемма_N | N        |\n",
        "\n",
        "\n",
        "**NB**: Задания со знаком `*` необязательные, их выполнение принесёт дополнительные баллы\n",
        "\n",
        "**NB №2**: Также приветствуются любые дополнительные шаги с Вашей стороны (использование дополнительныех библиотек, дополнительный анализ и т.д.)"
      ],
      "metadata": {
        "id": "MC_gSpq7vwQS"
      }
    },
    {
      "cell_type": "code",
      "source": [
        "import requests, json, nltk, re, pymorphy2, string, csv\n",
        "from bs4 import BeautifulSoup"
      ],
      "metadata": {
        "id": "wa4bLUXF2kwj"
      },
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "code",
      "source": [
        "nltk.download('stopwords')\n",
        "nltk.download('punkt')"
      ],
      "metadata": {
        "id": "xcWUB9RMFJ88"
      },
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "code",
      "source": [
        "def remove_stop_words(tokens: str, stop_words: list) -> list:\n",
        "  clean_tokens = []\n",
        "  for token in tokens:\n",
        "    if token not in stop_words:\n",
        "      clean_tokens.append(token)\n",
        "  return clean_tokens"
      ],
      "metadata": {
        "id": "dw9t09ePEq58"
      },
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "code",
      "source": [
        "url=[\"https://ru.wikipedia.org/wiki/%D0%92%D0%B8%D0%BA%D0%B8%D0%BF%D0%B5%D0%B4%D0%B8%D1%8F\",\"https://ru.wikipedia.org/wiki/%D0%93%D0%B0%D0%BB%D0%B0%D0%BA%D1%82%D0%B8%D0%BA%D0%B0_%D0%90%D0%BD%D0%B4%D1%80%D0%BE%D0%BC%D0%B5%D0%B4%D1%8B\",\"https://ru.wikipedia.org/wiki/%D0%9F%D0%BE%D0%BA%D0%B5%D1%80\"]"
      ],
      "metadata": {
        "id": "-40SvcO0wEvH"
      },
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "code",
      "source": [
        "res=[]\n",
        "soup=[]\n",
        "for i in url:\n",
        "  res.append(requests.get(i))\n",
        "  soup.append(BeautifulSoup(res[-1].text, 'html5lib'))\n",
        "\n",
        "main_text = ''\n",
        "for i in soup:\n",
        "  for tag in i('p'):\n",
        "   main_text += tag.text\n",
        "\n",
        "with open(\"/content/links.txt\", \"w\") as f:\n",
        "  for i in soup:\n",
        "    for j in i('img'):\n",
        "      f.write(j['src']+'\\n')"
      ],
      "metadata": {
        "id": "NWQBMxwl3NiT"
      },
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "code",
      "source": [
        "sentences = nltk.tokenize.sent_tokenize(main_text, language='russian')\n",
        "aveage_len=0\n",
        "for i in sentences:\n",
        "  regexp = r'\\w+'\n",
        "  tokens = re.findall(regexp, i)\n",
        "  aveage_len+=len(tokens)\n",
        "aveage_len/=len(sentences)\n",
        "print(aveage_len)\n",
        "res_txt = re.sub(r'[^а-яА-Я0-9\\s]', '', main_text)\n"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "4LB3duhVBLeP",
        "outputId": "72e49181-765b-4031-b0fb-6b7e177f8be9"
      },
      "execution_count": null,
      "outputs": [
        {
          "output_type": "stream",
          "name": "stdout",
          "text": [
            "20.845378151260505\n"
          ]
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "russian_stop_words = nltk.corpus.stopwords.words('russian')\n",
        "\n",
        "tokens = nltk.tokenize.word_tokenize(res_txt, language='russian')\n",
        "\n",
        "clean_tokens = remove_stop_words(tokens, russian_stop_words)\n"
      ],
      "metadata": {
        "id": "MCZYkqcs-sZP"
      },
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "code",
      "source": [
        "morph = pymorphy2.MorphAnalyzer()"
      ],
      "metadata": {
        "id": "wT4vhx7pFmxc"
      },
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "code",
      "source": [
        "with open(\"/content/lemmas.txt\", \"w\") as f:\n",
        "  for i in clean_tokens:\n",
        "    f.write(morph.parse(i)[0].normal_form+' ')"
      ],
      "metadata": {
        "id": "er5W5G8LFrjj"
      },
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "code",
      "source": [
        "def count_frequencies(tokens: list) -> dict:\n",
        "  special_symbols = '<>«»-–+\\\\' + string.punctuation\n",
        "  \n",
        "  lemmas = [morph.parse(token)[0].normal_form for token in tokens \n",
        "            if token not in special_symbols and token not in russian_stop_words]\n",
        "  \n",
        "  return nltk.probability.FreqDist(lemmas)"
      ],
      "metadata": {
        "id": "h0Ojt6UBKsQK"
      },
      "execution_count": null,
      "outputs": []
    },
    {
      "cell_type": "code",
      "source": [
        "word_frequencies = count_frequencies(clean_tokens)\n",
        "word_frequencies.most_common(1)"
      ],
      "metadata": {
        "colab": {
          "base_uri": "https://localhost:8080/"
        },
        "id": "-KCRJQdMKyZK",
        "outputId": "f6b7dcac-064f-4a50-d6ed-4fdbef091713"
      },
      "execution_count": null,
      "outputs": [
        {
          "output_type": "execute_result",
          "data": {
            "text/plain": [
              "[('галактика', 183)]"
            ]
          },
          "metadata": {},
          "execution_count": 149
        }
      ]
    },
    {
      "cell_type": "code",
      "source": [
        "with open('/content/lemmas_frequencies.csv', 'w', newline='', encoding='utf-8') as csvfile:\n",
        "    fieldnames = [\"Лемма\",\"Частота\"]\n",
        "    writer = csv.DictWriter(csvfile, fieldnames=fieldnames)\n",
        "\n",
        "    writer.writeheader()\n",
        "    for i in word_frequencies:\n",
        "      writer.writerow({fieldnames[0]:i,fieldnames[1]:word_frequencies[i]})"
      ],
      "metadata": {
        "id": "BymWaUm-LbsK"
      },
      "execution_count": null,
      "outputs": []
    }
  ]
}